const express = require('express');
const cors = require('cors');
const axios = require('axios');

const app = express();
const port = 5011;

// 启用 CORS 和 JSON 解析
app.use(cors());

// ChatGLM API 配置
const CHATGLM_API_KEY = 'b19da47245b94dd4975e747f89d903eb.CtPVvyxeED0hAcbD'; 
const CHATGLM_API_URL = 'https://open.bigmodel.cn/api/paas/v4/chat/completions';

// 处理前端请求
app.get('/llm/request', async (req, res) => {
    const { question } = req.query; // 获取查询参数中的问题
    if (!question) {
        return res.status(400).json({ error: '问题不能为空' });
    }

    // 设置 SSE 响应头
    res.setHeader('Content-Type', 'text/event-stream');
    res.setHeader('Cache-Control', 'no-cache');
    res.setHeader('Connection', 'keep-alive');
    res.flushHeaders();

    try {
        const response = await axios.post(CHATGLM_API_URL, {
            model: 'chatglm_pro',
            messages: [{ role: 'user', content: question }],
            stream: true,
        }, {
            headers: {
                'Authorization': `Bearer ${CHATGLM_API_KEY}`,
                'Content-Type': 'application/json',
            },
            responseType: 'stream',
            timeout: 5000, // 设置超时为 5 秒
        });

        response.data.on('data', (chunk) => {
            const data = chunk.toString();
            // 如果接收到 [DONE] 说明结束
            if (data.includes('[DONE]')) {
                res.write('data: done\n\n');
                res.end();
                return;
            }

            // 通过正则匹配提取内容
            const match = data.match(/"content":"(.*?)"/);
            if (match) {
                const text = match[1];
                res.write(`data: ${text}\n\n`);
            }
        });

        // 结束流时发送 done
        response.data.on('end', () => {
            res.write('data: done\n\n');
            res.end();
        });

    } catch (error) {
        console.error('请求 LLM 失败:', error);
        if (error.code === 'ECONNABORTED') {
            res.write('data: [请求超时: 请稍后再试]\n\n');
        } else {
            res.write('data: [服务器错误: 无法获取回答]\n\n');
        }
        res.end();
    }
    
});

app.listen(port, () => {
    console.log(`后端运行在 http://localhost:${port}`);
});
